home *** CD-ROM | disk | FTP | other *** search
- hcc 2.00 eXtended Version
- known bugs not fixed:
- ----------------------------------
-
- char chr;
- ...
- test(chr = 1)
- compiles to:
- (move.w #1, <chr>)
- what maybe will overwrite another variable or cause an exception:
- address error (if <chr> is not even)
-
- ----------------------------------
-
-
- assignment from pointer to integer value produces error
- "pointer not allowed". Shouldn'd it work? Example:
- char *p, *fun();
- int i;
- i = p; /* "error: pointer not allowed" */
- i = fun(); /* "error: pointer not allowed" */
-
- ----------------------------------
- last modifications - by Volker Seebode -
- version/patchlevel x35
- Sun Sep 16 1995
-
- - fixed initialization/decl of auto arrays w/o nbr of elements like
- char text[] = "Hello";
- - cdecl was not parsed (and thrown away) -> fixed
- - no more warnings "incompatible pointer type" when passing (void *) pointers as args
- - superfluous ';' during local decls are skipped now
- - -W-PUN switch for "undef undefined" warning
-
- version/patchlevel x34
- Tue Aug 29 1995
-
- - "volatile" and "const" weren't parsed inside struct/enum - fixed
- - "volatile" and "const" weren't parsed inside casts - fixed
- - var or parm decl like "char * const * p" weren't parsed - fixed
- WARNING: "volatile" and "const" are parsed only without any effekt
- - bus error occured after message
- "arg N: passing int from pointer lacks a cast (loosing significant bits) for"
- (pointer arg passed by integer with size < 4) - fixed
- - passing int for proto short caused a bus error using long ints
- ("hcc -L" or "cc -mlong" respectively) - fixed
- - __STDC__ was not internally defined, now it is
- - the "#pragma" option "PTY" didn't work - fixed
- - include file names aren't made lowercase any more
- - switch labels with long switch vars got overwriten by an sprintf() - fixed
- - error messages reflecting prototypes now include
- file and line of prototype declaration
- - prototype/arg checking now works on structures too
- - new flag "-F[no]-size-t-long" setting the type returned by the sizeof
- operator to "unsigned long" (default: unsigned int).
- WARNING: you need TOP pl>24 and a special lib (called libct.a)
- to use this option!
- - int default parms not explicit declared ( fun(intparm){ ... } )
- got storage class extern -> fixed
- - bug in general code generation function `_addcode()' fixed
- - '#' statements inside the false branch of an '#if'-statement were processed
- anywhere on a line, even inside comments -> fixed
- - added warning for static function definition following non static decl
-
- last modifications - by Volker Seebode -
- version/patchlevel x33
- Wed Aug 1 1995
-
- function prototypes implemented.
- New options:
- -F[no-]proto: [don't] use prototypes for type checking, also
- accessible via `#pragma PTY'.
- default: use prototypes.
- -WNPR: complain call of functions w/o prototype, also accessible via
- `#pragma NPR'. If prototyping is disabled, -WNPR is set to false.
- default: don't warn if call to function w/o prototype is detected.
- `__STDC__' is internally defined with value 0 if prototype checking is ON
- variables are distinguished from macros with same name, for example:
- #define key(a) ((a)*4)
- int key;
- works. `key' is handled as macro only if there are argument(s) following, else
- it references the var `key'.
-
- version/patchlevel x32
- Sat Jun 24 1995
-
- const expressions were not unfolded completely. That's why complex macros
- couldn't be calculated during expansion and produced the error
- message "bad INIT expression". Fixed
- code for auto struct/union/array initialization was missing, added
- bitfield initialization was broken, fixed
- bug in assignment from signed bitfields fixed
- casted pointers with postinc/postdec are accepted now and handled correctly
- the `?' Operator didn't work on pointers and double vars, fixed
- test of double vars (e.g. "if (double_var)") was broken, fixed
- assignement in function parameter passing didn't work with double vars, fixed
- ' inside comments and excluded lines was processed for character constants
- (error "char-const overflow"), fixed
- /* inside comment is complained if nested comments are disabled
- changed -f option to -F
-
- last modification - by jerry geiger -
- version/patchlevel x31
- APR 26 1995
-
- bug in out-file-name generation fixed
- bug with func decls in structures fixed
- new cml/pragma option -IFD (implicit decl fun)
-
- PL 30
- func decls without IDs should work now everywhere
- PL 29
- function pointers are handled like function names now always
- and in every context like: v = x->y.z(args);
- no more limits to define '-D' options in commandline
- warnings if undefining an undefined macro
-
- version/patchlevel x28
- MAR 26 1995
- - debug symbols changed (generated with -X option)
- - less memory when including header files
-
- last modifications - by Volker Seebode -
- version/patchlevel x27
- Sun Jan 15 1995
- - the flags '-fdouble-reg-vars', '-ffloat-args' and
- '-fframe-relative' were handled inverted -> fixed.
- - detection of alloca() was buggy: any function name beginning with
- 'alloca' triggered A6-relative restoring of regs.
-
- version/patchlevel x26
- Sat Dec 24 1994
- changed code generation for switch tables (compiled with -DLABELDIFF):
- '.dc.w Lxxx' -> '.dc.w Lxxx-Lyyy'.
-
- WARNING: you need TOP Patchlevel >= #21 and JAS Patchlevel >= #10
- for this version of HCC!
-
- version/patchlevel x25
- Mon Nov 07 1994
-
- floating point:
- - fixed inherit()/rinherit() to copy double val
- - new options:
- -fdouble-reg-vars: put register double vars into regs if possible
- (default: ON)
- -ffloat-args: pass float args as floats (default: OFF)
- -fframe-relative:restore regs A6 relative (default: OFF)
- Specifying this option works for all inputfiles.
- It is also activated for the next (or current) function,
- if a call to alloca() is detected or
- by the #pragma-statement "FRL".
-
- These flags may be inverted by inserting "no-",
- WARNING: you need TOP Patchlevel >= #22 to use this option!
- e.g. -fno-double-reg-vars.
-
- version/patchlevel x24
- Mon Oct 03 1994
-
- floating point:
- - implemented IEEE double precision with 64 bit
-
- - added exit code for functions changing the stack pointer
- (by calling alloca()...) to make register variables possible.
-
- WARNING: you must have TOP Patchlevel >= #19 to use these features!
-
- version/patchlevel x23
- Sun Sep 25 1994
-
- bitfields:
- - changed code generation
- - long bitfields implemented ( unsigned long foo : 25; )
- - default order reversed (first bit = MSB)
-
-
- last modifications - by jerry g geiger -
-
- version/patchlevel x22
- Thu Sep 22 1994
-
- adding something to a void * pointer will generate an error message
- now - better than causing an exception during runtime ;-)
-
- comparing an unsigned to a signed value will cause a warning
- unless switched off by -W-CUS
-
- adding something to a void * pointer will cause a warning, cause
- actually nothing is added (void has length 0!)
-
-
- version/patchlevel x21
- Sep 15 1994
-
- bug with mixing up 'lsr' and 'asr' instructions and unsigned
- shorts and shorts fixed.
-
- version/patchlevel x20
- Sep 09 1994
- longs in switch/case should be handled correctly now.
- $ACE environment variable forces hcc to use handle -1 for stderr
- (cause ACE can't handle such things)
- __GDATE__ and __SDATE__ macros fixed.
- a bug occuring with pointer addition/sub sometimes fixed
- (resulting in a 'asr.w' instruction instead of 'asr.l')
-
- version x19
- Jul 29 1994
- especially for Holger :
- you can switch off the bad return value/type warnings now
- -W-BRV / #pragma -BRV
-
- the commandline syntax changed a little bit
- (see man file or 'hcc -h')
-
- version x17
- Jul 04 1994
- bug fixed:
- auto cast of negative short constants to long
-
- Jun 13 1994
- the meaning of $INCLUDEDIR changed a little bit:
- it replaces now the built in pathes with
- '${INCLUDEDIR}\sozobonx' and $INCLUDEDIR
- &array is allowed for type checking now
- calling a function via pointer (*func)() should work with
- func(); now, too
- buildin macros changed according to standard
- accepts '/' in include pathes
- ipc'ed files' timestamps are tested now, the newer one is included
- diagnostic output is always written to stderr now
- a man file exists now
- some minor bugs fixed
- $SOZOBONCNF isn't recognized/supported any longer
-
- version x15
- Apr 19 1994
- #pragma option 'echo' built in:
- '#pragma echo ...' will echo the rest of the line to stderr
-
- bug fixes:
- local enum declarations work now (no more bus errors)
- missing #endif's are errors for TRUE #if's now, too
- comparing to 0 should work under all circumstances now
- (there was an error in cast routines)
-
-
- version x14
- Mar 15 1994 file date: March 23 1994
- integer constants:
- should now handled as provided by ANSI:
- Constants are never negativ (except ones prefixed by a '-')
- Hex and octal constants are always unsigned.
- Constants are of the smallest type they fit in.
-
-
- version x13
- Mon Mar 7 1994
-
- integer constants:
- cause stil some problems; a hexadecimal one with leading '0's as
- '0x0000FFFF' is of type long now.
- The handling of constants is still not as provided by ANSI standard.
- Hex and octal constants are not unsigned by default.
- Any constants may become negative, if they don't have a suffix 'U'!
- This is an error, of course. I'll try to fix it.
-
- new #pragma option:
- #pragma [+|-]PMR
- switch on/off warning 'probably missing return'
-
- changed macro:
- SOZOBON
- It has the value of 0x200, as the originals' version number;
- new macros:
- __SOZOBONX__
- Is defined for our eXtended version of Sozobon C compiler, it
- will keep the version number of eXtended SOZOBON version as:
- 0x200 + our revision number (0x213 for current version).
- __MSHORT__
- Is TRUE if int is a 16 Bit value. (Undefined with -L option).
-
- version x12
- Mon Feb 28 1994
- integer constants:
- hex and octal constants tend to be unsigned now, a hexadecimal one,
- with leading '0's as '0x0000FFFF' is of type long now.
- There is still an error in handling of constants - sorry - comparing
- of two constants can produce wrong code.
-
- Arrays larger than 32K should be handled correctly now.
-
- Environment:
- SOZOBONCNF=
- "standard": DATE in __DATE__ macro will be of format MM/DD/YY
- else it it will be DD.MM.YY
- "devconout": diagnostic output will not be written to STDERR/Gemdos
- console handle but to BIOS console device
-
- function handling:
- A non void declarated function now will cause a warning, if there is
- no return value specified; this works of course the other way round,
- too.
- A warning will be generated, if hcc cannot decide wether the
- specified return statements will return always some correct value.
-
- Bugs fixed:
- A 'switch' without a case-block now won't force hcc to an exception
- any more. I hope so.
-
-
- version x11
- Sun Dec 19 1993
- Environment:
- SOZOBONCNF=
- List of comma seperated strings:
- "standard" diagnostic output will not go to BIOS console device
- handle but to STDERR/Gemdos console
-
- STDERR=
- If this variable exists diaginstic output will go to Gemdos handle 2
- and not to Gemdos console handle.
-
- Macros:
- new macro __CDATE__ implemented; it represents a date-string of the
- format "Mon DD YYYY"
-
- commandline Options:
- -v: be verbose
- -V: print complete Version info
-
- Bugs fixed:
- The error when reading a function declaration like
- 'int main( int argc, char *argv[])' is fixed. (The error was mixing up
- the type of array with the pointer's type.)
-
- Bugs kept:
- A 'const' statement may still cause some trouble, so better '#undef const'
- in your source code.
-
- ----
- Änderungen an HCC V2.0, modifizierte Version 2.00x10
- von Holger Weets (Atari(/Amiga)), Christian Wempe (Amiga(/Atari))
- und Detlef Wuerkner (Amiga(/Atari))
- Stand: 20.04.93
-
-
- Erstmal die schlechten Nachrichten:
-
- An der Original Version 2.0 des Compilers hat sich praktisch kaum etwas ver-
- ändert, somit sind wir verantwortlich für alle Fehler, die mit der neuen
- Version auftreten, und mit der alten nicht. Natürlich können wir dafür aber
- nicht haftbar gemacht werden, die Benutzung erfolgt auf eigene Gefahr.
- Jeder Benutzer erkennt dies mit dem ersten Starten des Programmes an.
-
- Folgende Fehler sind aktuell bekannt:
- -------------------------------------
- - funktion(char_variable = integer_konstante)
- führt zu einer Zuweisung an <char_variable> auf Wortbreite (!),
- was entweder in einem Adress-Fehler endet (3 Bomben) oder zu
- einem (teilweisen) Überschreiben der nächsten Variablen
-
- Und jetzt all die guten Nachrichten:
-
-
- Updates:
- - x1 -> x2:
- Option '-Q' eingebaut. Bewirkt, daß der Compiler schnelleren Code
- erzeugt, auch wenn dieser das Programm länger macht.
- Code-Erzeugung bei Struktur-Zuweisungen geändert:
- - bei '-Q' erzeugt XCC max. 15 move's, ohne max. 3
- - Erzeugung von move-Listen bei Strukturen, deren Länge nicht durch
- 4 teilbar ist, verbessert. Code ist hier jetzt schneller UND kürzer.
-
- - x2 -> x3:
- Erzeugung von 'switches' wesentlich verbessert; der erzeugte Code ist
- jetzt i.A. sowohl schneller als auch kürzer.
-
- - x3 -> x4:
- - der Compiler teilt dem TOP jetzt mit, dass er die erweiterte Version
- ist, und somit laeuft TOP jetzt auch mit anderen (alten) Versionen
- des Compilers anstandslos zusammen
- - neues 'pragma' Argument 'FST' schaltet die '-q' Option ein/aus
- - neues 'pragma' Argument 'TOP' schaltet den TOP Funktionenweise ein/aus
- - neues 'pragma' Argument 'OPT' uebergibt den nachfolgenden String an
- TOP als neue Optionen
- - Pointer-Vergleiche, bei denen ein 'viod *' beteiligt ist, liefern
- jetzt keine Warnung des Compilers mehr
- - Fehler beim scannen der CPP-Tokens behoben
- - trap's werden nur noch generiert, wenn die Option '-L' nicht angegeben
- wurde
-
- - x4 -> x5:
- - es werden jetzt spezielle Sprungtabellen erzeugt, die nur halb so
- lang sind, wie die alten; allerdings lassen sich so erzeugte
- Assemblerfiles auch nur noch mit dem von mir modifizierten JAS V2.00x1
- uebersetzen...
-
- - x5 -> x6:
- - Float-Fehler aus V2.00x5 wieder ausgebaut...
- - noch weiter optimiert
- - mit der neusten Version des TOP übersetzt
- - die includierten Files werden jetzt mit ausgegeben
- - das String-Merging funktioniert jetzt auch im Zusammenhang mit
- CPP-Konstanten, ist somit jetzt endlich vollständig implementiert
- - C++ - Kommentarzeichen implementiert ('//', Kommentar bis Zeilen-
- ende)
- - wieder in HCC umbenannt, weil die veränderte Versionsnummer und
- die Info-Zeile bereits eindeutig zeigt, daß es sich um eine
- modifizierte Version des Compilers handelt (schliesslich haben wir
- den Optimizer ja auch nicht umbenannt, obwohl wir den quasi neu-
- geschrieben haben)
-
- - x6 -> x7:
- - Option '-X' für Debugging implementiert (s.u.)
- - aeusserst aergerlichen Fehler entfernt, der falsche movem - Anweisungen
- bewirkte; solange mit TOP uebersetzt wurde, machte er sich nicht
- bemerkbar, und auch ansonsten trat er nur in einem Spezialfall auf,
- aber dann....
- - hcc kann jetzt auch float's und double's wieder in Registern halten;
- V1.21 konnte dies bereits, aber aus V2.00 scheint es ausgebaut
- worden zu sein, ohne das es hierfuer einen Grund gibt...
-
- - x7 -> x8:
- - optimiert
- - es werden jetzt auch short's registert...
- - "__TOS__" ist jetzt WIRKLICH vordefiniert
- - bessere TOP-Unterstützung
- - Fehler-Erholung bei CPP-Errors verbessert
- - ST-Version: Stack groesser gemacht; fuer 'normale' Quelltexte
- reichte der alte auch (ich habe damit noch nie Probleme gehabt),
- aber es scheint auch Texte zu geben, die den hcc zu sehr tiefer
- Rekursion zwingen und bei solchen ist er schon mal abgestuerzt.
- - ST-Version: falls die Fehlermeldungen des Compilers auf den
- Bildschirm ausgegeben werden, erscheinen sie jetzt auch wieder
- untereinander (vorher wurde nur ein NL ausgegeben, was für
- Dateien und C-Desk's Console Fenster auch reicht)
- - es gibt ein neues Programm fuer das SOZOBON-System, den IPC
- (Includefile PreCompiler), geschrieben von mir (Holger) und
- portiert auf den Amiga von Christian (wem sonst ?) und mir
- Dieses Programm wird von hcc jetzt unterstützt, d.h. beim
- Laden von Includefiles wird zunächst das precompilierte gesucht,
- und erst wenn dieses nicht gefunden wird, das "normale" File
- gelesen. Der Vorteil dieser Methode ist natürlich, daß das
- uebersetzen schneller geht, da precompilierte Dateien wesentlich
- kuerzer sind und ausserdem "vorgekaut". Fuer Details siehe Datei
- "IPC.TXT"
- - beim Übersetzen der MiNT-Sources bemerkt: hcc brachte bei
- "test(&main);"
- eine Fehlermeldung. Das '&' vor dem Funktionsnamen ist völlig
- überflüssig, aber nicht verboten. Jetzt kommt nur noch die
- Warnung "& ignored".
-
- - x8 -> x9:
- - der Compiler hat nicht bemerkt, wenn 'break' oder 'continue' an
- illegalen Stellen verwendet wurden, stattdessen wurde dafür
- 'bra L-1' erzeugt, was weder top noch jas sehr witzig fanden
- (06.11.92)
- - die Anzahl der Fehler wird jetzt nur noch auf dem Bildschirm
- ausgegeben, wenn -V angegeben wurde
- - wenn die Fehlermeldungen in eine Datei geschrieben werden, und
- -V angegeben wurde, dann werden sie zusätzlich auch noch auf den
- Bildschirm ausgegeben; dies wurde vor allem deshalb implementiert,
- weil sonst bei Erzeugung einer Fehlerdatei die Warnungen des
- Compilers verlorengehen, da dieser richtigerweise nur dann einen
- Exitcode != 0 liefert, wenn Fehler aufgetreten sind; wenn nur
- Warnungen kamen, war/ist der Exitcode == 0 und niemand merkte
- etwas vom Inhalt der Fehlerdatei
- (19.03.93)
- - falls -V nicht angegeben war und der hcc Fehler gefunden hat, so
- wurde trotzdem 0 als ExitCode zurückgegeben, was natürlich nicht
- im Sinne des Erfinders war.
-
- - x9 -> x10:
- - Fehlermeldungen '? member ID' & 'select non struct' so um-
- konstruiert, daß der nicht gefundene Identifier ausgegeben wird
- - hcc kann jetzt ANSI-Funktionsköpfe lesen, d.h.
- extern char *malloc(int size);
- ist erlaubt, und
- void main(int argc, char **argv, char *envp)
- {
- ...
- }
- auch (!!!).
- Natürlich ist die K&R Schreibweise auch weiterhin erlaubt und wird
- nicht (wie bei anderen Compilern) mit einer Warnung oder gar
- Fehlermeldung bedacht.
- Ebenfalls implementiert wurde der spezielle Bezeichner '...' als
- (letzter) Funktionsparameter. Bedeutung: "hier können wahlweise
- noch mehr Parameter kommen, müssen aber nicht, und eine Typüber-
- prüfung soll ab hier auch nicht mehr stattfinden". Benutzt wird
- soetwas etwa bei "fprintf(FILE *fp, char *fmt, ...)", also dort,
- wo variabel viele Parameter kommen können.
- - Schlüsselworte 'signed', 'cdecl', 'volatile', 'const' und 'pascal'
- implementiert (wegen ANSI-Kompatibilität)
- signed: Speicherklasse; da alle Typen defaultmäßig signed
- sind, ist dieses Schlüsselwort nur für Casting
- und für den zukünftigen Typechecker interessant,
- ansonsten ist er mit 'int' gleichbedeutend.
- cdecl: Speicherklasse für Funktionen; Soll bedeuten, daß
- die Parameter auf dem Stack übergeben werden, und
- nicht in Registern (oder sonstwie); der hcc kann
- Parameter nur auf dem Stack übergeben, deshalb hat
- dieses Schlüsselwort aktuell keinen anderen Zweck,
- als die Übersetzbarkeit von ANSI-Sourcen zu gewähr-
- leisten.
- pascal: Speicherklasse für Funktionen; Soll bedeuten, daß
- die Parameter "falsch herum" auf dem Stack liegen
- und das diese Funktion den Stack selber aufräumt;
- Beides geschieht aktuell nicht, das noch kein
- Prototyping implementiert wurde. Aktuell hat dieses
- Schlüsselwort nur den Zweck, die Übersetzbakeit von
- ANSI-Sources zu gewährleisten.
- volatile: Speicherklasse für lokale Variablen;
- Soll bedeuten, daß diese Variable nicht in ein
- Register gelegt werden darf;
- der hcc legt nur Variablen in Register, die auch
- mit "register" gekennzeichnet sind, dieses
- Schlüsselwort hat also aktuell keinen anderen
- Zweck, als die Übersetzbarkeit von ANSI-Sourcen
- zu gewährleisten.
- const: Speicherklasse für Variablen; bedeutet, das die
- so gekennzeichneten Variablen nur gelesen, jedoch
- niemals überschrieben werden;
- wird ignoriert, bis ich die unübersichtliche NODE
- Struktur vollständig verstanden habe und sie auch
- ganz überblicken kann, dieses Schlüsselwort hat
- also aktuell keinen anderen Zweck, als die Über-
- setzbarkeit von ANSI-Sourcen zu gewährleisten.
-
- ACHTUNG: weil sich hierdurch die Menge der Schlüsselwörter geändert
- hat, ist es notwendig, daß alle precompilierten Header-
- Files mit der neuen Version des IPC übersetzt werden!
-
-
- Geschwindigkeits-Vergleich:
- ---------------------------
- Compiler Computer Dhrystones (V1.1/REGS) Prg.-Länge
- ====================================================================
- DR-C Mega-ST, TOS 1.04 862 12905 Bytes (*)
- SOZOBON-C Amiga AMIGADOS 1428 5200 Bytes (##)
- TC (2.0) Mega-ST, TOS 1.04 1562 10648 Bytes (**)
- PC Mega-ST, TOS 1.04 1562 12332 Bytes (x)
- SOZOBON-C Mega-ST, TOS 1.04 1612 4121 Bytes (#)
- PC Mega-ST, TOS 1.04 1724 12234 Bytes (**)
- (#) : es wurden XCC V2.00x6 & TOP V2.00x6 & XDLibs verwendet
- (##) : gleicher Compiler & Optimizer, bloß auf dem Amiga (Länge ungefähr)
- (*) : lag als ausführbare Datei dem Quelltext bei, ist also nicht nachprüfbar
- (wir haben den Compiler nicht)
- (**) : von einem Bekannten (Carsten) gemacht (-> Ergebnis sicher)
- (x) : mit 'cdecl' gemacht, also "wirklicher" Code-Erzeugungs-Vergleich...
-
- Der Dhrystone-Quelltext kann bei uns bezogen werden (lief auch schon
- auf 'ner Cray...).
-
- Diese Werte sind nur dazu gedacht, um daß weitverbreitete Vorurteil abzubauen,
- daß PD-Compiler langsam und schlecht sind, und außerdem viel zu langen Code
- erzeugen (man beachte die Programm-Längen...)
-
- Noch ein Beispiel dazu:
- Der Frank hat kürzlich (mal wieder) ein Apfelmännchen-Programm geschrieben,
- natürlich mit SOZOBON-C. Die getestete Version brauchte 2 min. 14 sec für
- die komplette Grafik und war 23 KB lang. Bei einem Bekannten (Carsten)
- ließen wir das gleiche Programm unter TC compilieren. Das Ergebnis war, daß
- die Version 7 KB länger wurde, und trotz Mathe-Coprozessor 3 min 34 sec für
- die gleiche Berechnung benötigte, also über eine Minute länger rechnete ...
-
- Da die Leute von SOZOBON endlich mit der Version 2.0 des Compilers heraus-
- gekommen sind, mußten wir unsere Erweiterungen/Fehlerbereinigungen natürlich
- sofort in diese Version einbauen.
- Anscheinend ist der Support für den Amiga inzwischen besser, als der für den
- Atari, denn obwohl SOZOBON-C für den ST geschrieben ist, haben wir diese
- Version vom Amiga bekommen und auf den ST zurück-angepasst, weil anscheinend
- keiner was von einer ATARI-Version 2.00 weiß ...
-
- (falls Herr Würkner (alias TETISOFT) jetzt diese Zeilen liest:
- ^!$%§%#??
- ... und beim nächsten Mal benutzen wir dann '#ifdef FOR_AMIGA' an ALLEN
- Stellen, die nur für den Amiga geändert wurden!...)
-
- Die von uns modifizierte Version des Compilers trägt den Namen XCC
- (eXtended C-Compiler) und die Versions-Nummer 2.00x6 (nur 'x6' hinzugefügt)
-
-
- DIVERSES:
- ---------
- - Es wurde einiges optimiert, ent-rekursioniert und entwanzt
-
- - Wenn das Datei-Ende innerhalb eines Kommentars lag, so endete dies in einer
- Endlosschleife des Compilers - behoben
-
- - Wenn das Datei-Ende innerhalb eines #if/#ifdef/#ifndef lag, so führte
- dies ebenfalls zu einer Endlosschleife, falls die Bedingung falsch war
- bzw. der #else - Zweig erreicht war. Dies wird jetzt mit einer Fehler-
- meldung quittiert.
-
- - die Meldung 'lost X nodes' kommt jetzt seltener (gar nicht mehr ?)
-
- - Die Hex-Notation in String-Konstanten funktioniert jetzt auch richtig...
-
- - so etwas wie 'printf("Umlaut-Test: äöüÖÄÜß\n")' funktioniert jetzt endlich
- Umlaute im Quelltext werden jedoch auch weiterhin als White-Space
- interpretiert.
-
- - der Compiler stürzt nicht mehr ab, wenn jemand lokale Arrays bei der
- Deklaration gleich initialisieren wollte.
-
- - wenn der Compiler auf ein Statement der Form 'if ()' (also ohne was in den
- Klammern) traf, dann stuerzte er ab -- behoben
-
- - wenn die geschweifte Klammerung bei 'do {....} while();' fehlerhaft ist,
- dann stuerzte der Compiler manchmal ab -- behoben
-
- - bisher pasierte es manchmal, daß HCC/XCC falscherweise die Fehlermeldung
- 'struct redefined ...' ausgab. Dies lag daran, daß bei unbenannten
- Strukturen/Union's intern eigene Namen vergeben werden, und diese
- auffrund eines Denkfehlers nicht immer eindeutig waren, der Compiler
- also den selben Namen an zwei Strukturen vergeben hat. Dieser Fehler
- wurde behoben.
-
- - Zusammenarbeit mit TOP verbessert:
- 1. XCC generiert Zeilen der Form ';loop Lx', mithilfe derer der TOP dann
- (endlich) Loop-rotations machen kann.
- 2. XCC generiert Zeilen der Form ';ret [a|d]0', welche dem TOP dazu dienen,
- mehr Optimierungen zu machen.
- 3. XCC generiert Zeilen der Form ';sstart' & ';send', welche dem TOP
- anzeigen, daß hier Code für 'switches' steht, welcher umsortiert werden
- soll
- 4. XCC generiert ';longs', wenn die '-L' Option angegeben wurde, dies ist
- wichtig fuer die Register Parameter
- 5. XCC generiert ';notop' fuer alle Funktionen, die zwischen einem
- '#pragma -TOP' und '#pragma +TOP'
- stehen; das bedeutet, das TOP diese Funktionen nicht optimieren soll
- (praktisch zum debuggen)
- 6. XCC generiert ';opt "<optionen-string>"', wenn eine Zeile
- '#pragma OPT "<optionen-string>"
- gefunden wird. Dies dient (aktuell nur) dazu, die Optionen fuer TOP
- funktionenweise veraendern zu koennen
- 7. XCC generiert ';xhcc', um dem TOP anzuzeigen, das mit dem erweiterten
- Compiler gearbeitet wird. TOP verwendet dies fuer die Behandlung der
- ';ret' Direktive, um auch mit alten Versionendes Compilers lauffaehig
- zu sein
-
-
- PREPROZESSOR:
- -------------
- - Das Macro __DATE__ wurde neu implementiert.
-
- - Das Macro __TIME__ wurde neu implementiert.
-
- - Dem Macro TOS wurde das Macro __TOS__ ergänzt, weil es anscheinend keine
- einheitliche Schreibweise gibt, und ich dieses auch schon irgendwo gesehen
- habe
-
- - Es wurde ein Macro Namens __BASE_FILE__ implementiert, welches dem Benutzer
- auch innerhalb von Include-Files die Möglichkeit gibt, auf den Namen der
- Haupt-Datei zuzugreifen
-
- - Das CPP-Kommando '#assert' wurde implementiert.
- Syntax : #assert <ausdruck>
- Wirkung: Falls <ausdruck> FALSE ist, erfolgt eine Fehlermeldung seitens des
- Compilers und die Compilierung wird abgebrochen
-
- - Das CPP-Kommando '#pragma' wurde implementiert.
- Syntax : #pragma [+|-<NAME> ...] [irgendwas]
- oder #pragma OPT "<string>"
- Wirkung: dient zum Umschalten einiger Optionen;
- #pragma +<name> schaltet die Option ein, durch '-<name>' wird sie
- ausgeschaltet. Folgende Namen sind implementiert:
- - PRO: Profiling ein/aus
- - PTR: 'pointer types mismatch' ein/aus
- - CMP: 'cmp of diff ptrs' ein/aus
- - DIF: 'diff ptrs' ein/aus
- - RDF: 'redefined: SYM' ein/aus
- - STR: String-Optimierung ein/aus
- - FST: Quick-Flag (Option '-q') ein/aus
- - TOP: Optimizer (funktionsweise) ein/aus
- (wird nur einmal pro Funktion ausgegeben)
-
- #pragma OPT "<string>" schreibt <string> in die Ausgabe-Datei.
- Dies kann zum umschalten der Optionen des Optimizers je nach
- zu optimierender Funktion verwendet werden.
- Der String wird max. einmal pro Funktion ausgegeben!
- Bisher gab es eine Fehlermeldung bei #pragma, was nicht Standard-Gemäß ist
-
- - Das CPP-Kommando '#error' wurde implementiert.
- Syntax : #error ["Meldung"]
- Wirkung: Falls "Meldung" angegeben wird, so erfolgt die Ausgabe dieses
- Strings als Fehlermeldung, ansonsten gibt es eine Standard-
- Meldung und die Compilierung wird abgebrochen
- Praktisch z.B., um auf Portierungs-Probleme hinzuweisen...
-
- - Das CPP-Kommando #asm wird implementiert (noch in Arbeit...).
- Syntax : #asm assembler-code
- Wirkung: Funktioniert wie asm(), ist aber weniger Schreibkrams...
- Funktioniert bedingt auch außerhalb von Funktionen.
- Dieses ist zum gegenwärtigen Zeitpunkt nicht errreichbar, da die Implemen-
- tierung noch nicht ganz abgeschlossen ist.
-
-
- OPTIONEN:
- ---------
- - Die neue Option '-Oname' bewirkt, daß die Assembler-Ausgaben in die Datei
- <name> geschrieben wird, was insbesondere die Möglichkeit zur Laufwerks-
- übergreifenden Compilierung bietet
-
- - Die neue Option '-Ename' bewirkt, daß alle Meldungen des Compilers nicht
- auf dem Bildschirm, sondern in die Datei <name> geschrieben werden
-
- - Die neue Option -N bewirkt, daß Kommentare geschachtelt werden dürfen
-
- - Die neue Option -Mzahl bewirkt, daß die Compilierung nach maximal <zahl>
- Meldungen (errors, warnings) abgebrochen wird.
-
- - Die neue Option -S bewirkt, daß mehrfach vorhandene Strings nicht mehr
- zu einem zusammengefasst werden.
-
- - Mit der neuen Option -T kann die Generierung der TRAP-Befehle abgeschaltet
- werden (falls sich jemand eigene Funktionen gemdos(), bios() oder xbios()
- schreiben will...). Siehe unten
-
- - Die neue, von Detlev Würkner implementierte, und von uns korrigierte
- Option -L bewirkt, daß alle als 'int' deklarierten Variablen 32Bits
- groß sind (also int = long). Diese Option ist nur sehr wenig getestet,
- also mit Vorsicht zu geniessen. Um sie nutzen zu können, müßten alle
- Bibliotheken ebenfalls mit dieser Option neu übersetzt werden, wozu
- ich natürlich keine Lust habe. Außerdem wird es Probleme mit den
- direkten traps geben, da das Betriebs-System natürlich nach wie
- vor auf 16Bit-Werten besteht.
-
- - Mit der Option -X kann er Debug-Modus eingeschaltet werden. In diesem
- Fall generiert der Compiler zusätzlichen Code, und im Falle eines Absturzes
- meldet das Programm die Zeile und die Datei, in der der Fehler auftrat.
- Dazu muß das Programm allerdings mit dem Startup-Code 'DEBUG_S.O' gelinkt
- werden.
- Die Syntax ist -X[N][function], wobei
- N den Debug-Level angibt, und
- function den Namen einer Benutzer-Definierten Debug-Funktion
- Aktuell sind die Levels 1 und 2 implementiert, bei Level 1 werden
- die Zeilennummern generiert, sowie Aufrufe der angegebenen Funktion
- am Anfang, am Ende und in jeder Schleife einer Funktion. In Level 2
- wird pro Sourcecode-Zeile ein Aufruf der angegebenen Funktion generiert,
- so daß im Prinzip ein Source-Level-Debugging moeglich ist. Eine dafür
- geeignete Funktion liegt in einer ersten, unvollstaendigen Version bereits
- bei: Sie heisst "_debug" und liegt in den Dateien DEBUG_A.O und DEBUG_C.O
- vor, diese Dateien muessen beim Linken VOR den XDLibs angegeben werden.
- Beim selberschreiben einer solchen Funktion ist auf jeden Fall zu beachten,
- daß alle Register gerettet werden müssen, da dies beim Aufruf (natuerlich)
- nicht geschieht.
- Wenn die Angabe einer Debug-Funktion fehlt, sind Level 1 und 2 identisch.
-
- - Die Kommandozeile hat somit folgendes Aussehen:
- hcc [-DUIPNVMSLT] [-X[N][function]] [-OSFILE1] [-EERRFILE1] CFILE1 [...]
- d.h. für jede Datei koennen eine eigene Fehlerdateien und (natürlich)
- Ausgabedateien angegeben werden
-
-
-
- SONSTIGE ERWEITERUNGEN:
- -----------------------
- - Variablen vom Typ 'void *' sind jetzt zu allen anderen Zeigern kompatibel,
- d.h. bei Zuweisungen erfolgt keine Warnung mehr vom Compiler
-
- - Bei Meldungen des Compilers, die sich auf ein Include-File beziehen, wird
- jetzt der Zugriffs-Pfad mit ausgegeben
-
- - In String-Konstanten können jetzt alle Umlaute und sonstigen Sonderzeichen
- direkt angegeben werden. Bisher konnten diese Zeichen nur über die
- Oktal-Notation '\XXX' ausgegeben werden.
-
- - Die Multi-Byte-Characters wurden implementiert. Bisher wurden sie zwar ge-
- duldet, d.h. nicht angemeckert, aber NICHT behandelt. Folgendes funktioniert
- jetzt:
- int i = 'ab';
- long j = 'abc';
- long k = 'abcd';
- Folgendes hingegen funktioniert (logischerweise) nicht:
- short i = 'abc';
- führt jedoch auch zu keiner Meldung vom Compiler ...
-
- - Die String-Konkatenation wurde implementiert. Beispiel:
- printf("Hello " /* hier KEIN Komma */
- "world");
- führt zu keinem Fehler, sondern zur gewünschten Ausgabe "Hello world".
- Diese Erweiterung kommt insbesondere der Lesbarkeit des Quelltextes
- zugute, wenn lange Strings ausgegeben werden sollen. Außerdem spart sie
- Arbeit beim portieren von ANSI-Quelltexten...
-
- - Die Funktion asm() wurde dahingehend erweitert, daß jetzt ein einfacher
- Zugriff auf alle Variablen möglich ist.
- Beispiel: asm(" move.l #1, <i>");
- wird zu: move.l #1, REGISTER falls i register-Variable ist
- oder : move.l #1, OFFSET(a6) falls i lokale Var oder Parameter ist
- oder : move.l #1, _i falls i externe & globale Var ist
- oder : move.l #1, Lnummer falls i statisch ist
- oder : move.l #1, <i> falls i unbekannt ist
-
- - Das Profiling wurde (endlich) implementiert, es tut sich jetzt also wirklich
- etwas, wenn die Option '-P' in der Kommando-Zeile angegeben wird.
- Am Anfang jeder Funktion wird der Aufruf einer Funktion Namens '_prolog'
- eingefügt, welche in C folgendes Aussehen hat:
- void _prolog(char *name)
- <name> ist hierbei ein Zeiger auf den Namen der gerade ausgeführten Funktion
- (z.B. "main")
- Am Ende jeder Funktion wird der Aufruf einer Funktion Namens '_epilog'
- eingefügt, welche in C folgendes Aussehen hat:
- void _epilog(char *name)
- wobei <name> wieder ein Zeiger auf den Namen der aktuellen Funktion ist.
- Der Parameter wurde absichtlich über den Stack übergeben, damit auch alle
- nicht-Assembler-Programmierer sich ihre eigenen Profiling-Funktionen
- schreiben können. Damit die so erzeugte Tabelle auch ausgegeben wird, muß
- beim Linken ein spezieller Startup-Code verwendet werden: 'prof_s.o'. Dieser
- ruft direkt vor der Terminierung des Programmes eine Funktion Namens
- '_saveprof' auf (in C: void _saveprof() ), welche die Tabelle in formatierter
- Form in eine ASCII-Datei Namens 'prof.out' im aktuellen Verzeichnis schreibt.
- Das ganze funktioniert somit natürlich nicht 100%ig, wenn in verschiedenen
- Dateien statische Funktionen gleichen Namens verwendet werden...
- Die zugehörigen Standard-Funktionen finden sich in der von uns modifizierten
- Version der DLibs (sollte beiliegen, kann ansonsten bei uns bezogen werden).
- Sollte das mit profiling übersetzte Programm abstürzen, dann nochmal über-
- setzen, und zwar OHNE Optimizer...
-
- - alle Aufrufe von gemdos(), bios() und xbios() werden jetzt direkt als
- trap - Befehl erzeugt; aus einem 'jsr _gemdos' wird z.B. 'trap #1';
- Die Vorteile:
- - der trap - Befehl ist 2 Bytes lang, jsr dagegen 6
- - der jsr-Befehl benötigt 20 Taktzyklen,
- der rts-Befehl 16
- der trap-Befehl 34
- --
- 70 Taktzyklen plus dem, was da noch gemacht
- wird (Stack-Test, Rücksprung-Adresse vom
- und auf den Stack)
- -> der direkte trap-Befehl ist somit mehr als doppelt so schnell in
- der Ausführung und auch noch kürzer
- (C-Desk ist z.B. mehr als 300 Bytes kürzer geworden)
- Der Nachteil:
- - kein Stack-overflow-Test mehr (tritt sowieso nie auf, es sei denn
- durch einen Programmier-Fehler)
- Abschaltbar durch '-T'.
-
- - die Code-Erzeugung für 'switch' wurde wesentlich verbessert. Bisher konnte
- es z.B. passieren, daß bei unglücklicher Wahl der 'case' - Werte aus einem
- 'switch' 4 gemacht wurden, was natürlich langsameren und längeren Code er-
- zeugt, als ein 'switch'
-
-
- Sonstiges
- ---------
- - Erweiterungen/Änderungen gegenüber der Version 1.21 sind den übrigen Texten
- zu entnehmen
- - alle von TETISOFT vogenommenen Änderungen sind ebenfalls in einem anderen
- Text aufgeführt, jedoch größtenteils in der vorliegenden Version nicht oder
- in modifizierter From enthalten.
-
-
-